#ifndef _ZY_APP_H_
#define _ZY_APP_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include "zq_gl.h"

#ifndef     QL_HTTP_OK
#define     QL_HTTP_OK 0
#endif

// Macro Definition =====================================================================================================================
//#define ZQ_DEBUG										// TODO 后面合并到编译选项里

// encrypt key
#define AKM_MQTT_KEY 					("aucma2021")
#define ZY_MQTT_KEEP_ALIVE				60					// mqtt 心跳 (原300s) 

// define file path
#define ZQ_CONFIG_DIR_PATH	"UFS:/app"
#define ZQ_CONFIG_FILE_PATH "UFS:/app/aucma.dat"
#define ZQ_UUID_FILE_PATH "UFS:/ftm"
#define ZQ_QA_FILE_PATH "UFS:/kg_debug"

#define ZQ_OFFLINE_MSG_MAX_CNT  500		// 协议要求，离线总数据数量<=500
#define ZQ_OFFLINE_SEND_CNT		200     // 协议要求，离线单次发送据数量<=200
#define offline_msgs_path "UFS:/offline_msgs"

// struct definition -----------------------------------------------------------------------------------------------
typedef struct {
	/* Cat1也有机会要保存这3个值的 */
	uint8_t  ble_uuid[16];
	uint16_t ble_major;
	uint16_t ble_minor;
	uint8_t  sim_num[32];
	uint8_t  sim_len;
	int32_t  bootmode; // 01:SA, 02:FA, 03:WK
} ZqProductionInfo;		// 生产文件结构，用来得到uuid，sim等信息

typedef enum {
	CTRL_STATE_OFF = 0x00,			// 控制器状态-关闭
	CTRL_STATE_NORMAL,				// 控制器状态-正常开机
	CTRL_STATE_LP_PRE,				// 控制器状态-低功耗前期
	CTRL_STATE_LP,					// 控制器状态-低功耗
	CTRL_STATE_LP_24H,				// 控制器状态-低功耗 每24H激活上报状态
	CTRL_STATE_SA,					// 生产半制
	CTRL_STATE_FA,					// 生产全制
}ZyCtrlState;

// TODO BUF长度待修改
#define ZY_BASE_INFO_SIZE 50
#define ZY_BASE_NEAR_CNT 3
#define ZY_WIFI_INFO_SIZE 60
#define ZY_WIFI_CNT 10

// 需要存储到Flash的数据
typedef struct {
	int uploadInterval;			// report interval
	int version;				// shadow version
	int offline_reset_stage;	// 离线重起级别
} ZqLocalSaveData;

// struct definition -----------------------------------------------------------------------------------------------
typedef struct {
	// 模块Id  查询 string 模块唯一识别号（IMEI）
	const char* moduleId;
	// 模块类型 controllerType 查询 string
	// 0:定位模块; 1:远程控制模块; 2:GPRS 温控器; 3:升级版4G温控器; 4:@see温控器
	const char* controllerType;
	// 设备类型 devType 查询 string
	// 01:卧式冷冻柜; 02:立式冷冻柜; 04:卧式冷藏柜; 08:立式冷藏柜; 10:冷藏冷冻柜; 11:车载冷冻柜; 14:车载冷藏柜;
	// 20:冷热转换柜; 21:加热柜; 24:风幕柜
	const char* devType;
	// 模块功能  查询 string 多个功能用英文逗号隔开
	// 01:带 GPS 定位; 02:带WIFI定位; 03:带蓝牙广播; 04:带温度采集; 05:带压缩机控制; 06:带门开关采集; 07:带电池;
	// 08:带温度调节; 09:带能耗检测; 10:带风机控制; 11:带人流量采集; 12:带图片采集; 13:带角度传感器; 14:带灯控制;
	// 15:灯电流检测; 16:环境温度检测; 19:节能功能; 24:灯模式调节
	char* function;
	// 网络类型  查询 string 2g\4g\nb
	char* moduleType;
	// 软件版本号  查询 string 例如1.0.1，按照供应商的规则自行定义
	char* softwareVers;
	// 硬件版本号  查询 string 例如1.0.1，按照供应商的规则自行定义
	char* hardwareVers;
	// 接入网络方式  查询 int 0:移动网络，1:WIFI
	int accessType;
	// 厂家代码  查询 string  由澳柯玛分配
	char* manufactureCode;

	// SIM卡号 查询 string SIM卡号，例如1440639281453
	char* sim;
	// ICCID 查询 string 物联网卡唯一识别号
	char* iccid;
	// IMSI 查询 string 国际移动用户识别码
	char* imsi;
	// WiFi MAC地址 查询 string 78:d3:8d:be:76:1
	char* wifiMAC;
	// Bt MAC地址 bluetoothMAC 查询 string 78:d3:8d:be:76:45
	char* bluetoothMAC;

	// 报警参数
	// 高温报警  查询 int 0：告警解除 1：发生告警
	int highTemp;
	// 低温报警  查询 int 0：告警解除 1：发生告警
	int lowTemp;
	// 断电报警  查询 int 0：告警解除 1：发生告警
	int outageTemp;
	// 传感器报警  查询 int 0：告警解除 1：发生告警
	int errorTemp;

	// 温度上回差 查询 float 单位：摄氏度，范围、默认值根据 规格书设定，本地可调, 单位 0.1c
	int upReturnTemp;	// KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数
	// 温度下回差 查询 float 单位：摄氏度，范围、默认值根据 规格书设定，本地可调, 单位 0.1c
	int downReturnTemp; // KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数
	// 传感器故障压机开机时间 查询 int 单位：分钟，范围0~99，本地可调
	int sensorFaultCompressorTurnOnTime;
	// 传感器故障压机关机时间 查询 int 单位：分钟，范围0~99，本地可调
	int sensorFaultCompressorTurnOffTime;
	// 除霜周期  查询 int 单位：小时，范围：0~99，本地可调
	int defrostInterval;
	// 除霜时间  查询 int 单位：分钟，范围1~99，本地可调
	int defrostTime;
	// 压机最小停机时间 查询 int 单位：分钟，范围为0~15，本地可调
	int minCompressorOffTime;
	// 实际温度 上传/查询 float 单位：摄氏度
	int trueTemp; // KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数
	// 温度 上传/查询 float 单位：摄氏度，显示温度
	int temp; // KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数
	// 门状态 上传/查询 int 0：关 1：开
	int doorStatus;
	// 压缩机状态  上传/查询 int 压缩机实时状态 0：关 1：开
	int outageState;
	// 本地控制状态 上传/查询 int 压缩机本地控制状态 0：关 1：开
	int localAction;
	// 主控信号强度 上传/查询 string
	char* signalIntensity;
	// LED灯电流 上传/查询 string 单位mA
	char* ledCurrent;
	// 有无电池 上传/查询 int 0：无 1：有
	int battery;
	// 供电方式  上传/查询 int 0：市电供电 1：电池供电
	int power;
	// 电池电压 上传/查询 float 单位：V，范围0~100
	int voltage; // KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数
	// 主基站信息 上传/查询 string 格式：mcc,mnc,lac,cellid,signal。(以英文逗号间隔)  
	// Modified by Conan -- 2023-02-07 13:37 -- TBC len 40?
	char* btsInfo;
	// 周边基站个数 nearsbtsNum 上传/查询 int 0~N，默认3
	// Modified by Conan -- 2023-02-07 13:37 -- TBC 限定个数小于等于3？
	int nearsbtsNum;
	// 周边基站信息 上传/查询 string 例如：mcc,mnc,lac,cellid,signal|mcc,mnc,lac,cellid,signal|mcc,mnc,lac,cellid,signal(以英文逗号与竖杠间隔)
	char* nearsbtsInfo;
	// 周边热点个数  上传/查询 int 0~N，默认10
	int apNum;
	// 周边热点信息 上传/查询 string mac,signal,ssid|mac,signal,ssid|mac,signal,ssid 例如;f0:7d:68:9e:7d:18,-41,TPLink;(以英文逗号与竖杠间隔)
	char* apInfo;	// 暂定
	// 故障代码  上传/查询 string E0：无故障; E1：读卡失败或无SIM卡; E2：冷藏传感器开路或短路故障; E3：冷冻传感器开路或短路故障; E4：服务器注册失败
	// E5：无效或非法的SIM卡; E7：信号强度弱或无信号; EA：MCU通信故障; EB：WIFI模块通信故障; EC：蓝牙模块通信故障; 多种故障同时发生时以英文逗号分开
	char* errorCode;   // [3*9+1]
	// 人流量  上传/查询 int 红外感应遮挡一次，次数累加一次，每一次发送完数据即清零重新计算，总体累加由服务器进行
	int humanTraffic;
	// 开关门次数 上传/查询 int 单位：次
	int openCounts;
	// 负载电流  上传/查询 float 单位：A
	int loadCurrent; // KJ_INT_F3型 存储是int型x1000, 表示精度3位的浮点数, 从m0读到的是mA
	// 负载电压 上传/查询 int 单位：V
	int loadVoltage;	// , 从m0读到的是V
	// 有功功率 上传/查询 float 单位：W
	int activePower; // KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数, 从m0读到的是W
	// 设定温度  查询/设置 float 单位：摄氏度，范围、默认值根据 规格书设定，本地可调 单位 1c
	int tempSet; // KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数
	// 温度补偿值 tempCompensation 查询/设置 float 单位：摄氏度，范围、默认值根据 规格书设定，本地可调, 单位 0.1c
	int tempCompensation; // KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数
	// 温度设置上限 tempHighLimit 查询/设置 float 单位：摄氏度，范围、默认值根据规格书设定
	int tempHighLimit; // KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数
	// 温度设置下限 tempLowLimit 查询/设置 float 单位：摄氏度，范围、默认值根据规格书设定
	int tempLowLimit; // KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数
	// 高温报警阈值 highTempAlarmValue 查询/设置 float 单位：摄氏度，范围、默认值根据规格书设定
	int highTempAlarmValue; // KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数
	// 低温报警阈值 lowTempAlarmValue 查询/设置 float 单位：摄氏度，范围、默认值根据规格书设定
	int lowTempAlarmValue; // KJ_INT_F1型 存储是int型x10，表示精度1位的浮点数

	// 开门角度  上传/查询/设置 int 单位：度，范围0~100，每次设置必须是5的倍数 
	int doorAngle;
	// 温控器状态  上传/查询/设置 int 0：关 1：开
	int controllerState;
	// 上传频率  上传/查询/设置 int 单位：分钟，范围10~1440,默认30
	int uploadInterval;

	// 灯状态  上传/查询/设置 int 0：关 1：开
	int lightState;
	// 风机状态  上传/查询/设置 int 0：关 1：
	int fanState;

	// 其他似乎遗漏的: 影子版本
	int version;
	// 时间戳  上传/查询 long 从1970-01-01 00:00:00的时间，精确到秒
	int timestamp;

	// 温控模式 上传/查询/设置 int 0:制冷模式 1:制热模式 2:节能模式
	int tempControlMode;
} ZqParams;

typedef enum {
	ZQ_ERR_CODE_NONE,			//E0：无故障	 -- 目前支持
	ZQ_ERR_CODE_NO_SIM,			//E1：读卡失败或无SIM卡 -- 目前支持
	ZQ_ERR_CODE_COOL,			//E2：冷藏传感器开路或短路故障 -- 目前支持
	ZQ_ERR_CODE_FREEZE,			//E3：冷冻传感器开路或短路故障 -- 目前支持
	ZQ_ERR_CODE_REGISTER,		//E4：服务器注册失败 -- 目前支持
	ZQ_ERR_CODE_INVALID_SIM,	//E5：无效或非法的SIM卡 -- 目前支持	
	ZQ_ERR_CODE_SIGNAL = 7,		//E7：信号强度弱或无信号 -- 目前支持
	ZQ_ERR_CODE_MCU = 10,		//EA：MCU通信故障 -- 无此故障
	ZQ_ERR_CODE_WIFI,			//EB：WIFI模块通信故障 -- 无此故障
	ZQ_ERR_CODE_BLE,			//EC：蓝牙模块通信故障 -- 无此故障
} ZQ_ERR_CODE;
extern void ZqSetErrCode(ZQ_ERR_CODE code, uint8_t flag);
extern char* ZqGetErrCode(void);

/*********************************************Extern Function Declare*************************************************/
extern char m0_sw_ver_str[];				// m0 software version string, 4位
extern char local_joint_ver_str[];			// M0_Cat1联合版本string, 4位

extern ZqProductionInfo zq_production_info;
extern uint32_t zq_timer_s;
extern void zq_app_init(void);


#ifdef __cplusplus
} /*"C" */
#endif

#endif /* _ZY_APP_H_ */


